import { Message,Loading } from 'element-ui';
import instance from './interceptor'
import instanceTwo from './interceptorForm'
import config from "../../package.json";
const {ipcRenderer} = window.require("electron");


/**
 * 核心函数，可通过它处理一切请求数据，并做横向扩展
 * @param {url} 请求地址
 * @param {params} 请求参数
 * @param {options} 请求配置，针对当前本次请求；
 * @param loading 是否显示loading
 * @param mock 本次是否请求mock而非线上
 * @param error 本次是否显示错误
 */
function request(url,params,method,options={loading:true,mock:false,error:true}){
    let loadingInstance;
    // 请求前loading
    if(options.loading)loadingInstance=Loading.service();
    return new Promise((resolve,reject)=>{
        let data = {}
        // get请求使用params字段
        if(method ==='GET')data = {params}
        // post请求使用data字段
        if(method ==='POST')data = {data:params}
        // 通过mock平台可对局部接口进行mock设置
        // if(options.mock)url='http://www.mock.com/mock/xxxx/api';
        instance({
            url,
            method,
            headers: {    // 定义统一的请求头部
                "Content-Type": "application/json",
            },
            ...data
        }).then((res)=>{
            // 此处作用很大，可以扩展很多功能。
            // 比如对接多个后台，数据结构不一致，可做接口适配器
            if(res.code === 200){
                resolve(res.data);
            }else if (res.code === 700){
                if(options.error)Message.error(res.message);
            }else{
                // 通过配置可关闭错误提示
                if(options.error)Message.error(res.message);
                reject(res);
            }
        }).catch(()=>{
            if(options.error) Message.error('网络异常，请稍后再试！')
        }).finally(()=>{
            if (options.loading)loadingInstance.close();
        })
    })
}
function requestNext(url,params,method,options={loading:true,mock:false,error:true}){
    let loadingInstance;
    // 请求前loading
    if(options.loading)loadingInstance=Loading.service();
    return new Promise((resolve,reject)=>{
        let data = {}
        // get请求使用params字段
        if(method ==='GET')data = {params}
        // post请求使用data字段
        if(method ==='POST')data = {data:params}
        // 通过mock平台可对局部接口进行mock设置
        // if(options.mock)url='http://www.mock.com/mock/xxxx/api';
        instance({
            url,
            method,
            headers: {    // 定义统一的请求头部
                "Content-Type": "application/json",
                "language":localStorage.langValue === undefined || localStorage.langValue === 'undefined' ? 'zh':localStorage.langValue,
                "basicParams":config.versionCode
            },
            ...data
        }).then((res)=>{
            // 此处作用很大，可以扩展很多功能。
            // 比如对接多个后台，数据结构不一致，可做接口适配器
            if(res.code === 200){
                resolve(res);
            } else if (res.code === 700){
                if(options.error)Message.error(res.message);
                setTimeout(() => {
                    ipcRenderer.send("logout-dialog-remove")
                }, 2000);
            } else{
                // 通过配置可关闭错误提示
                if(options.error)Message.error(res.message);
                reject(res);
            }
        }).catch(()=>{
            if(options.error) Message.error('网络异常，请稍后再试！')
        }).finally(()=>{
            loadingInstance.close();
        })
    })
}
function requestMessage(url,params,method){
    return new Promise((resolve,reject)=>{
        let data = {}
        // get请求使用params字段
        if(method ==='GET')data = {params}
        // post请求使用data字段
        if(method ==='POST')data = {data:params}
        instanceTwo({
            url,
            method,
            headers: {    // 定义统一的请求头部
                "Content-Type": "application/json",
                "appCode":1,
                "basicParams": "{'appClient': 'web'}",
                "productCategory": "BZ-ALL"
            },
            ...data
        }).then((res)=>{
            // 此处作用很大，可以扩展很多功能。
            // 比如对接多个后台，数据结构不一致，可做接口适配器
            if(res.code === 200){
                resolve(res);
            }else if(res.code === 0){
                resolve(res);
            }else{
                // 通过配置可关闭错误提示
                reject(res);
            }
        }).catch(()=>{
            Message.error('Network error！')
        }).finally(()=>{
        })
    })
}
export default {
    request,
    requestNext,
    requestMessage
}